(function () {
  // 定义一个表示人的类
  class Person {
    // TS可以在属性前添加属性的修饰符
    /**
     * pubic 修饰的属性可以被任意地方访问（修改）默认值
     * private 修饰的属性只能在类内部访问（修改）
     * - 通过在类中添加方法使得私有属性可以被外部访问
     * protected 受保护的属性，只能在类中或者子类中访问
     */
    private _name: string;
    private _age: number;

    constructor(name: string, age: number) {
      this._name = name;
      this._age = age;
    }
    /**
     * getter方法用来读取属性
     * setter方法用来设置属性
     * - 它们被称为属性的存取器
     */
    // // 定义方法，用来获取name属性
    // getName() {
    //   return this._name;
    // }
    // // 定义方法，用来设置name属性 控制权在类中
    // setName(name: string) {
    //   this._name = name;
    // }

    // getAge() {
    //   return this._age;
    // }
    // setAge(age: number) {
    //   // 判断年龄是否合法
    //   if (age >= 0) {
    //     this._age = age;
    //   }
    // }

    // Ts中提供了更简洁的语法来定义存取器
    // Ts中设置getter方法的方式
    get name() {
      console.log("get name()执行了");
      return this._name;
    }
    set name(name: string) {
      console.log("set name()执行了");
      this._name = name;
    }
    get age() {
      console.log("get age()执行了");
      return this._age;
    }
    set age(age: number) {
      console.log("set age()执行了");
      if (age >= 0) {
        this._age = age;
      }
    }
  }
  const per = new Person("zhangsan", 18);

  /**
   * 现在属性是在对象中设置的，属性可以任意的被修改
   * 属性可以任意被修改将会导致对象中的数据变得非常不安全
   * 对敏感数据错一点会差很多
   */

  console.log(per.name);
  per.age = -33;
  per.name = "lisi";

  class A {
    protected num: number;
    constructor(num: number) {
      this.num = num;
    }
  }

  class B extends A {
    constructor(num: number) {
      super(num);
    }
    test() {
      console.log(this.num);
    }
  }

  class C {
    constructor(public name: string, public age: number) {}
  }
  const c = new C("zhangsan", 18);
})();
